/**
 * 数字格式化工具函数
 */

/**
 * 格式化价格
 * @param price 价格数值
 * @param currency 货币符号，默认为'¥'
 * @param decimals 小数位数，默认为2
 * @returns 格式化后的价格字符串
 */
export function formatPrice(
  price: number | string,
  currency = '¥',
  decimals = 2
): string {
  if (price === null || price === undefined || isNaN(Number(price))) {
    return `${currency}0.00`
  }
  
  const num = Number(price)
  return `${currency}${num.toFixed(decimals).replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`
}

/**
 * 格式化数字（添加千位分隔符）
 * @param num 数字
 * @param decimals 小数位数，默认为0
 * @returns 格式化后的数字字符串
 */
export function formatNumber(
  num: number | string,
  decimals = 0
): string {
  if (num === null || num === undefined || isNaN(Number(num))) {
    return '0'
  }
  
  const number = Number(num)
  return number.toFixed(decimals).replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @param decimals 小数位数，默认为2
 * @returns 格式化后的文件大小字符串
 */
export function formatFileSize(
  bytes: number,
  decimals = 2
): string {
  if (bytes === 0) return '0 Bytes'
  
  const k = 1024
  const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${sizes[i]}`
}

/**
 * 格式化百分比
 * @param value 百分比值（0-1之间）
 * @param decimals 小数位数，默认为2
 * @param withSymbol 是否添加百分号，默认为true
 * @returns 格式化后的百分比字符串
 */
export function formatPercent(
  value: number,
  decimals = 2,
  withSymbol = true
): string {
  if (value === null || value === undefined || isNaN(value)) {
    return withSymbol ? '0%' : '0'
  }
  
  const percent = value * 100
  const formatted = percent.toFixed(decimals)
  
  return withSymbol ? `${formatted}%` : formatted
}

/**
 * 数字范围限制
 * @param value 数值
 * @param min 最小值
 * @param max 最大值
 * @returns 限制在范围内的数值
 */
export function clamp(
  value: number,
  min: number,
  max: number
): number {
  return Math.min(Math.max(value, min), max)
}

/**
 * 生成指定范围内的随机整数
 * @param min 最小值（包含）
 * @param max 最大值（包含）
 * @returns 随机整数
 */
export function randomInt(min: number, max: number): number {
  return Math.floor(Math.random() * (max - min + 1)) + min
}

/**
 * 四舍五入到指定小数位
 * @param value 数值
 * @param decimals 小数位数
 * @returns 四舍五入后的数值
 */
export function round(value: number, decimals = 0): number {
  const factor = Math.pow(10, decimals)
  return Math.round(value * factor) / factor
}